import store from '@/store'
import { logout, saveToken } from '@/store/acitons/login'
import { ApiResponse } from '@/types/data'
import { Toast } from 'antd-mobile'
import axios, { AxiosError } from 'axios'
import history from './history'
import { getToken } from './storage'
const baseURL = 'http://geek.itheima.net/v1_0/'
const instance = axios.create({
  baseURL,
  timeout: 5000,
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const token = getToken().token
    if (token) {
      config.headers!.Authorization = 'Bearer ' + token
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError<{ message: string }>) {
    // 对响应错误做点什么
    if (!error.response) {
      Toast.show('网络繁忙,请稍后再试!')
      return Promise.reject(error)
    }
    if (error.response.status === 401) {
      // token 过期
      const token = getToken()
      if (!token.refresh_token) {
        //没有refresh_token 那么直接跳转到登录页面
        history.replace('/login', {
          from: history.location.pathname,
        })
        Toast.show('登录信息过期')
        return Promise.reject(error)
      }
      try {
        // 有refresh_token 那么就要发请求获取最新token 替换旧token
        const res = await axios.request<ApiResponse<{ token: string }>>({
          method: 'put',
          url: '/authorizations',
          baseURL,
          headers: {
            Authorization: `Bearer ${token.refresh_token}`,
          },
        })
        // console.log(res)
        store.dispatch(
          saveToken({
            token: res.data.data.token,
            refresh_token: token.refresh_token,
          })
        )
        // 重新发送请求
        return instance.request(error.config)
      } catch {
        history.replace('/login', {
          from: history.location.pathname,
        })
        Toast.show('登录信息失败')
        store.dispatch(logout())
        return Promise.reject(error)
      }
    }
    Toast.show(error.response.data.message)
    return Promise.reject(error)
  }
)

export default instance
